﻿
namespace MoneyBook.Web.Services {
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Data;
    using System.Linq;
    using System.ServiceModel.DomainServices.EntityFramework;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using MoneyBook.Web.Models;


    // MoneyBookEntities コンテキストを使用してアプリケーション ロジックを実装します。
    // TODO: これらのメソッドまたは追加のメソッドにアプリケーション ロジックを追加します。
    // TODO: 認証を設定し (Windows/ASP.NET Forms)、次の文字列のコメントを解除して、匿名アクセスを無効にします。
    // 必要に応じ、ロールを追加してアクセスを制限することも検討してください。
    // [RequiresAuthentication]
    [EnableClientAccess()]
    public class CategoryService : LinqToEntitiesDomainService<MoneyBookEntities> {

        // TODO:
        // クエリ メソッドの結果を限定することを検討してください。追加の入力が必要な場合は、
        //このメソッドにパラメーターを追加するか、追加のクエリ メソッドを別の名前で作成します。
        // ページングをサポートするには、'Categories' クエリに順序を追加する必要があります。
        public IQueryable<Category> GetCategories() {
            return this.ObjectContext.Categories.OrderBy(c => c.CategoryName);
        }

        [Query]
        public IQueryable<Category> GetCategoriesByAccount(int accountId) {
            return this.GetCategories().Where(c => c.AccountId == accountId);
        }

        public void InsertCategory(Category category) {
            if ((category.EntityState != EntityState.Detached)) {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(category, EntityState.Added);
            } else {
                this.ObjectContext.Categories.AddObject(category);
            }
        }

        public void UpdateCategory(Category currentCategory) {
            this.ObjectContext.Categories.AttachAsModified(currentCategory, this.ChangeSet.GetOriginal(currentCategory));
        }

        public void DeleteCategory(Category category) {
            if ((category.EntityState != EntityState.Detached)) {
                this.ObjectContext.ObjectStateManager.ChangeObjectState(category, EntityState.Deleted);
            } else {
                this.ObjectContext.Categories.Attach(category);
                this.ObjectContext.Categories.DeleteObject(category);
            }
        }
    }
}


